﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Acceso_a_Datos.FabricaDAOS;
using System.Xml;
using System.IO;
using Sistema_Totem.Logica.Exepciones_Logica;

namespace Sistema_Totem.Logica.Comandos.ComandoRequerimiento
{
    public class ComandoConsultarPlantillaRequerimiento: Comando<Requerimiento>
    {
        #region Atributos

        private int _IdProyecto;

        #endregion Atributos

        #region Constructor

        public ComandoConsultarPlantillaRequerimiento(int _IdProyecto)
        {
            this._IdProyecto = _IdProyecto;
        }

        #endregion Constructor

        #region Metodos

        public override Requerimiento Ejecutar()
        {
            this.Entidad = FabricaEntidad.ObtenerPlantilla();
            try
            {
              this.Entidad =FabricaDAO.CrearFabricaDeDAO(1).CrearDAOPlantilla().ConsultarPlantilla
                    ("Plantilla Requerimiento", this._IdProyecto);
              // retornamos el XMl de la plantilla vacia al presentador
              return LeerPlantillaVacia((this.Entidad as Plantilla).Estructura);
            }
            catch (NullReferenceException exceptionXML)
            {
                throw (new RequerimientoExcepcion("Error, la devolucion del objeto es null", exceptionXML));
            }
            
        }

        /// <summary>
        /// Metodo que devuelve la plantilla vacia de 
        /// un requerimiento.
        /// </summary>
        /// <param name="plantillaReq"></param>
        /// <returns></returns> 
        public Requerimiento LeerPlantillaVacia(XmlDocument plantillaReq) 
            {

                try
                {
                    this.Entidad = FabricaEntidad.NuevoRequerimiento();
                    XmlDocument xmlReq = plantillaReq;
                    XmlNodeList plantilla = xmlReq.GetElementsByTagName("PLANTILLA");
                    XmlNodeList referencia = ((XmlElement)plantilla[0]).GetElementsByTagName("REFERENCIAS");
                    XmlNodeList seccion = ((XmlElement)plantilla[0]).GetElementsByTagName("SECCION");
                    XmlNodeList titulo = ((XmlElement)plantilla[0]).GetElementsByTagName("TITULO");
                    XmlNodeList listElement = ((XmlElement)plantilla[0]).GetElementsByTagName("ELEMENTO");
                    Seccion _miSeccion = new Seccion();
                    _miSeccion.ListaControl = new List<ElementoControl>();
                    foreach (XmlElement nodo in seccion)
                    {
                        _miSeccion.Nombre = nodo.Value;

                        foreach (XmlElement nodoElemento in listElement)
                        {
                            int i = 0;
                            ElementoControl _elemento = new ElementoControl();
                            XmlNodeList nombre = nodoElemento.GetElementsByTagName("NOMBRE");
                            _elemento.Nombre = nombre[i].InnerText;
                            XmlNodeList tipo = nodoElemento.GetElementsByTagName("TIPO");
                            _elemento.Tipo = tipo[i].InnerText;
                            XmlNodeList estado = nodoElemento.GetElementsByTagName("ESTADO");
                            _elemento.Estado = estado[i].InnerText;
                            XmlNodeList contenido = nodoElemento.GetElementsByTagName("CONTENIDO");
                            _elemento.Contenido = contenido[i++].InnerText;
                            _miSeccion.ListaControl.Add(_elemento);

                        }
                        (this.Entidad as Requerimiento).ListaSeccion.Add(_miSeccion);
                    }
                    return (this.Entidad as Requerimiento);
                }
                catch (XmlException exceptionXML)
                {
                    throw (new RequerimientoExcepcion("Error al leer el XML de la plantilla de Requerimiento", exceptionXML));
                }
                
            }

         #endregion Metodos
    }
}